**Configuração tosca para sincronizar com serviços git**

O certo seria usar hooks, mas o que segue também funciona:

[[!toc levels=6]]

---

# Criar chave ssh

A chave ssh não tem senha, porque o processo é automatizado. No nosso caso, usamos o usuário `www-data` com a ikiwiki.

    www-data@lv1:~$ ssh-keygen -t rsa -b 4096 -C "www-data@lv1.iikb.org"

A chave ssh pública deve ser copiada e adicionada manualmente no [gogs](https://gogs.io), no github, no gitlab, ou onde quer que seja. Isto é uma limitação destas ferramentas. No caso deste site, o único [[wiki/espelho]] é no [notabug](https://notabug.org), que usa [gogs](https://gogs.io).

    www-data@lv1:~$ cat ~/.ssh/id_rsa.pub

# Configurar remotes

É necessário entrar no diretório do repositório git da ikiwiki para fazer isto. No caso deste site, todos diretórios ficam no mesmo sistema de arquivos por padrão a cada instância nova da ikiwiki, então basicamente temos isto:

    www-data@lv1:~$ ls -d1 *iikb*
    deviikborg
    deviikborg.git
    deviikborg.setup
    iikb
    iikb.git
    iikb.setup

No caso, o repositório git é o diretório `iikb.git`.

     www-data@lv1:~$ cd iikb.git
     www-data@lv1:~/iikb.git$ git remote add notabug git@notabug.org:iikb/iikb.org.git

# Atualizar automaticamente

[[Eu|desci]] criei um [script ](https://notabug.org/desci/scripts/src/master/iki-post-commit.bash) pra usar na crontab ou manualmente pra atualizar estes sites. Pior do que configurar hooks do jeito certo (tm), mas é o que ta funcionando por enquanto. Melhor do que perder os backups.

## Script em bash

    #!/bin/bash
    ## Este script serve para dar push a todos remotes configurados em um repositório GIT em um site ikiwiki.
    
    if [ ! -z $1 ]
    then
    	BASE="${HOME}"
    	SITE="${1}"
    	DIR="${BASE}/${SITE}.git/"
    	if [ -d "${DIR}" ]
    	then
    		pushd "${DIR}"
    		REMOTES="$(git remote -v | grep -e 'push' | awk '{ print $1 }')"
    		BRANCH="master"
    		for REMOTE in ${REMOTES[@]}
    		do
    			git push ${REMOTE} ${BRANCH}
    		done
    		popd
    	else
    		echo "${DIR} não é um diretório."
    	fi
    else
    	echo "Uso: $0 <SITE>"
    fi

Disponível em <https://notabug.org/desci/scripts/src/master/iki-post-commit.bash>

## Crontab

O script sem uma cronjob atualizando é inútil:

     www-data@lv1:~$ crontab -e

Conteúdo da crontab

    */5     *       *       *       *       /bin/bash /var/www/bin/iki-post-commit.bash iikb
    */5     *       *       *       *       /bin/bash /var/www/bin/iki-post-commit.bash deviikb

Ao invés de `*/5     *       *       *       *`, que faz atualizar de 5 em 5 minutos, é possível usar `@hourly` ou `@daily` para atualizar toda hora ou todo dia, respectivamente.
